package com.liushao.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.liushao.entity.UserBind;
import com.liushao.entity.UserInfo;
import com.liushao.entity.vo.UserBindVO;
import com.liushao.enums.UserBindEnum;
import com.liushao.hfb.FormHelper;
import com.liushao.hfb.HfbConst;
import com.liushao.hfb.RequestHelper;
import com.liushao.mapper.UserBindMapper;
import com.liushao.mapper.UserInfoMapper;
import com.liushao.service.UserBindService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.Map;

/**
 * <p>
 * 用户绑定表 服务实现类
 * </p>
 *
 * @author chen
 * @since 2025-01-03
 */
@Service
public class UserBindServiceImpl extends ServiceImpl<UserBindMapper, UserBind> implements UserBindService {


    @Autowired
    private UserInfoMapper userInfoMapper;

    /**
     *   账户绑定提交信息到托管平台
     * @param userBindVO
     * @param userId
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public String commitBindUser(UserBindVO userBindVO, Long userId) {
         //条件构造器
        QueryWrapper<UserBind> wrapper = new QueryWrapper<>();
        //查询身份证是否进行了绑定了
        wrapper.eq("id_card",userBindVO.getIdCard()).eq("user_id",userId);
        UserBind userBind = baseMapper.selectOne(wrapper);
        //你需要做逻辑判断???
        // 绑定过如何处理，没有绑定过，开始绑定
        wrapper = new QueryWrapper<>();
        wrapper.eq("user_id",userId);
        userBind = baseMapper.selectOne(wrapper);
        //判断用户是否有绑定记录
        // 没有绑定记录
        // 1.修改用户信息表的绑定记录
        // 2.修改绑定表的用户记录
        if(userBind==null){
            // 1.修改用户信息表
            UserInfo userInfo = userInfoMapper.selectById(userId);
            // TODO修改状态
            userInfo.setBindStatus(UserBindEnum.NO_BIND.getCode());
            userInfoMapper.updateById(userInfo);

            // 2.修改绑定信息表
            userBind = new UserBind();
            // 使用拷贝
            BeanUtils.copyProperties(userBindVO,userBind);
            userBind.setUserId(userId);
            // 绑定表的绑定状态
            userBind.setStatus(UserBindEnum.NO_BIND.getCode());
            baseMapper.insert(userBind);//添加数据库
        }else{
            //曾经绑定过 但是没有完成操作
            BeanUtils.copyProperties(userBindVO,userBind);
            baseMapper.updateById(userBind);
        }

        //要一堆参数
        /*







    email	string		否	邮箱.如果商户对接理财业务，必须传该参数.


         */
        Map<String,Object> paramMap = new HashMap<>();
        paramMap.put("agentId", HfbConst.AGENT_ID);// 	int		是	给商户分配的唯一标识
        paramMap.put("agentUserId",userId);//	string	50	是	商户的个人会员ID。由数字、字母组成。
        paramMap.put("idCard",userBindVO.getIdCard());//	string	18	是	身份证号
        paramMap.put("personalName",userBindVO.getName());//	string	50	是	真实姓名。由2~5个汉字组成。
        paramMap.put("bankType",userBindVO.getBankType());//	string	10	是	银行卡类型
        paramMap.put("bankNo",userBindVO.getBankNo());//	string	20	是	银行卡
        paramMap.put("mobile",userBindVO.getMobile());//	string	11	是	银行卡预留手机
        paramMap.put("returnUrl",HfbConst.USERBIND_RETURN_URL);//	string	255	是	绑定完成后同步返回商户的完整地址。
        paramMap.put("notifyUrl",HfbConst.USERBIND_NOTIFY_URL);//	string	255	是	绑定完成后异步通知商户的完整地址。
        paramMap.put("timestamp", RequestHelper.getTimestamp());//	long		是	时间戳。从1970-01-01 00:00:00算起的毫秒数
        paramMap.put("sign",RequestHelper.getSign(paramMap));//	string	32	是	验签参数。

        //自动构建表单
        String formStr = FormHelper.buildForm(HfbConst.USERBIND_URL, paramMap);

        return formStr;
    }
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void notifys(Map<String, Object> paramMap) {
        /*
          result_code	string		是	结果编码。
0001=绑定成功且通过实名认证
E105=绑定失败
U999=未知错误
result_msg	string	100	是	绑定结果描述
bind_code	string	50	是	绑定账户协议号
agent_user_id	string	50	是	账户在商户的会员ID
timestamp	long		是	通知时间。从1970-01-01 00:00:00算起的毫秒数。绑定错误不返回。
sign	string	32	是	签名。

         */

        String bindCode = (String) paramMap.get("bindCode");

        //账户在商户的会员ID
        String agentUserId = (String) paramMap.get("agentUserId");

        QueryWrapper<UserBind> wrapper = new QueryWrapper<>();
        wrapper.eq("user_id",agentUserId);

        //更新用户绑定表
        UserBind userBind = baseMapper.selectOne(wrapper);
        userBind.setBindCode(bindCode);//绑定code
        userBind.setStatus(UserBindEnum.BIND_OK.getCode());//绑定状态
        baseMapper.updateById(userBind);

        //更新用户表
        UserInfo userInfo = userInfoMapper.selectById(agentUserId);
        userInfo.setBindCode(bindCode);//绑定code
        userInfo.setIdCard(userBind.getIdCard());
        userInfo.setName(userBind.getName());
        userInfo.setBindStatus(UserBindEnum.BIND_OK.getCode());
        userInfoMapper.updateById(userInfo);






    }

    @Override
    public String getBindCodeByUserId(Long userId) {
        QueryWrapper<UserBind> wrapper = new QueryWrapper<>();
        wrapper.eq("user_id",userId);

        UserBind userBind = baseMapper.selectOne(wrapper);

        String bindCode = userBind.getBindCode();

        return bindCode;
    }
}
